// 并发与通道

// package main

// import (
// 	"fmt"
// 	"time"
// )

// func Task1() {
// 	for {
// 		fmt.Println(time.Now().Format("15:10:20"), "正在处理Task1的任务")
// 		time.Sleep(time.Second * 1)
// 	}
// }

// func Task2() {
// 	for {
// 		fmt.Println(time.Now().Format("11:12:14"), "正在处理Task2的任务")
// 		time.Sleep(time.Second * 1)
// 	}
// }

// func main() {
// 	go Task1()
// 	go Task2()
// 	for {
// 		fmt.Println(time.Now().Format("11:12:13"), "正在处理主进程的任务！")
// 		time.Sleep(time.Second * 2)
// 	}
// }

// 使用匿名函数创建 goroutine
// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	go func() {
// 		for {
// 			fmt.Println(time.Now().Format("15:04:05"), "正在处理Task1的任务")
// 			time.Sleep(time.Second * 3)
// 		}
// 	}()
// 	time.Sleep(time.Second * 100)
// }

// runtime 任务调度器 Gosched Goexit GOMAXPROCS
// GO 协程是抢占式调度， 当遇到长时间执行或者进行系统调用时， 会主动转让CPU
//1 syscall
//2 C函数调用
//3 主动调用runtime.Gosched
//4 某个goroutine 调用时间超过100ms , 并且这个goroutine 调用了非内联函数
// package main

// import (
// 	"fmt"
// 	"runtime"
// )

// func main() {
// 	go func() {
// 		for i := 0; i < 3; i++ {
// 			fmt.Println("go")
// 		}
// 	}()

// 	for i := 0; i < 2; i++ {
// 		runtime.Gosched()
// 		fmt.Println("main")
// 	}
// }

// package main

// import (
// 	"fmt"
// 	"runtime"
// 	"time"
// )

// func Task1() {
// 	defer fmt.Println("task1 stop")
// 	fmt.Println("task1 start")
// 	fmt.Println("task1 work")
// }

// func Task2() {
// 	defer fmt.Println("task2 stop")
// 	fmt.Println("task2 start")
// 	runtime.Goexit()
// 	fmt.Println("task2 work")
// }

// func main() {
// 	go Task1()
// 	go Task2()
// 	time.Sleep(time.Second * 5)
// }

// func main() {
// 	n := runtime.GOMAXPROCS(8)
// 	fmt.Println("先前CPU核数设置为：", n)
// 	last := time.Now()
// 	for i := 0; i < 100000; i++ {
// 		go func() {
// 			a := 99999 ^ 99999
// 			a = a + 1
// 		}()
// 	}
// 	now := time.Now()
// 	fmt.Println(now.Sub(last))
// }

// channel
// goroutine 运行在相同的地址空间， 访问共享内存必须做好同步
// channel 引用类型是CSP模式具体体现
// var 通道变量 chan 通道类型
// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	ch := make(chan string)
// 	go func() {
// 		fmt.Println(<-ch)
// 	}()
// 	ch <- "test"
// 	time.Sleep(time.Second)
// }

// 缓冲机制
/*
channel 按是否支持缓冲区可分为无缓冲的通道 unbuffered channel 和有缓冲的通道 buffered channel
*/

// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	// ch := make(chan int, 0) // 无缓冲
// 	ch := make(chan int, 3) // 有缓冲区， 在缓冲区未填满的情况下，程序不会被阻塞运行
// 	go func() {
// 		for i := 0; i < 3; i++ {
// 			fmt.Printf("len(ch)=%v, cap(ch)=%v\n", len(ch), cap(ch))
// 			ch <- i
// 		}
// 	}()
// 	for i := 0; i < 3; i++ {
// 		time.Sleep(time.Second)
// 		fmt.Println(<-ch)
// 	}
// }

// close range 操作 channel
// package main

// import (
// 	"fmt"
// )

// func main() {
// 	ch := make(chan int, 3)
// 	go func() {
// 		for i := 0; i < 3; i++ {
// 			fmt.Printf("len=%v, cap=%v\n", len(ch), cap(ch))
// 			ch <- i
// 		}
// 		close(ch)
// 	}()

// 	// for {
// 	// 	if val, ok := <-ch; ok == true {
// 	// 		fmt.Println(val)
// 	// 	} else {
// 	// 		return
// 	// 	}

// 	// }

// 	// 遍历 channel range 更合适
// 	for data := range ch {
// 		fmt.Println(data)
// 	}

// }

// 单向channel

// package main

// import (
// 	"fmt"
// 	"time"
// )

// func producer(out chan<- int) {
// 	for i := 0; i < 10; i++ {
// 		fmt.Printf("product %v\n", i)
// 		out <- i
// 	}
// 	close(out)
// }

// func consumer(in <-chan int) {
// 	for val := range in {
// 		fmt.Printf("consumer %v\n", val)
// 	}
// }

// func main() {
// 	ch := make(chan int, 5)
// 	go producer(ch)
// 	go consumer(ch)
// 	time.Sleep(time.Second * 5)
// }

// 定时器 标准库time 定时器的实现就是单向channel
// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	ticker := time.NewTicker(time.Second)
// 	for {
// 		<-ticker.C
// 		fmt.Println("loop")
// 	}
// }

// select 关键字可以监听channel 的数据流动  case语句必须是I/O操作
// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	ch := make(chan int)
// 	go func() {
// 		for i := 0; i < 3; i++ {
// 			ch <- i
// 		}
// 	}()
// 	for {
// 		select {
// 		case msg := <-ch:
// 			fmt.Println(msg)
// 		default:
// 			time.Sleep(time.Second)
// 		}
// 	}
// }

// select 超时
// package main

// import (
// 	"fmt"
// 	"time"
// )

// func main() {
// 	ch := make(chan int)
// 	done := make(chan bool)
// 	go func() {
// 		for {
// 			select {
// 			case val := <-ch:
// 				fmt.Println(val)
// 			case <-time.After(time.Second * 3):
// 				fmt.Println("已超时3秒")
// 				done <- true
// 			}
// 		}
// 	}()

// 	for i := 0; i < 10; i++ {
// 		ch <- i
// 	}
// 	<-done // 无值保持阻塞
// 	fmt.Println("程序终止")
// }

// 死锁 ：所有线程或进程都在等待系统资源释放
// package main

// func main() {
// 	ch := make(chan int)
// 	<-ch // 阻塞Main goroutine 信道ch 被锁
// }

// func main() {
// 	select {}
// }

package main

func main() {

}
